package com.shanyin.framework.common.util;

import java.util.ArrayList;
import java.util.List;

import com.shanyin.framework.common.enums.ICommonEnum;

/***
 ** @category 枚举工具类...
 ** @author qing.yunhui
 ** @email: qingyunhui@smoney.cc
 ** @createTime: 2017年9月15日下午2:53:53
 **/
public class EnumUtil {
	
	/**
	 * 根据给定code获取Value
	 * @param clzs  枚举类(该枚举类必须实现ICommonEnum接口)
	 * @param code 枚举code
	 * @return String 枚举Value
	 * */
	public static String getValueByCode(Class<?> clzs,Object code){
		ICommonEnum[] commonEnums=getICommonEnums(clzs);
		if(null==commonEnums) return null;
		for(ICommonEnum ienum:commonEnums){
			if(ienum.getCode().equals(String.valueOf(code))){
				return ienum.getValue();
			}
		}
		return null;
	}
	
	/**
	 * 根据给定value获取Value
	 * @param clzs  枚举类(该枚举类必须实现ICommonEnum接口)
	 * @param key 枚举key
	 * @return String 枚举Value
	 * */
	public static String getValueByKey(Class<?> clzs,Integer key){
		ICommonEnum[] commonEnums=getICommonEnums(clzs);
		if(null==commonEnums) return null;
		for(ICommonEnum ienum:commonEnums){
			if(ienum.getKey().intValue()==key.intValue()){
				return ienum.getValue();
			}
		}
		return null;
	}
	
	/**
	 * <p>根据给定key获取value</p>
	 * @param clzs 枚举类
	 * @param key 枚举key
	 * @return 枚举value
	 * */
	public static String getValueByKey(String clzs,Integer key){
		try {
			return getValueByKey(Class.forName(clzs), key);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * <p>根据给定key查询对应的枚举对象</p>
	 * @param clzs 枚举类
	 * @param key  枚举key
	 * @return 
	 * */
	public static ICommonEnum getEnumByKey(Class<?> clzs,Integer key){
		ICommonEnum[] commonEnums=getICommonEnums(clzs);
		if(null==commonEnums) return null;
		for(ICommonEnum ienum:commonEnums){
			if(ienum.getKey().intValue()==key.intValue()){
				return ienum;
			}
		}
		return null;
	}
	
	/**
	 * 根据给定Valuee获取code
	 * @param clzs  枚举类 (该枚举类必须实现ICommonEnum接口)
	 * @param value 枚举value
	 * @return String 枚举code
	 * */
	public static String getCodeByValue(Class<?> clzs,String value){
		ICommonEnum[] commonEnums=getICommonEnums(clzs);
		if(null==commonEnums) return null;
		for(ICommonEnum ienum:commonEnums){
			if(ienum.getValue().equals(value)){
				return ienum.getCode();
			}
		}
		return null;
	}
	
	/**
	 * 根据给定Value获取code
	 * @param clzs  枚举类 (该枚举类必须实现ICommonEnum接口)
	 * @param key 枚举key
	 * @return String 枚举code
	 * */
	public static String getCodeByKey(Class<?> clzs,Integer key){
		ICommonEnum[] commonEnums=getICommonEnums(clzs);
		if(null==commonEnums) return null;
		for(ICommonEnum ienum:commonEnums){
			if(ienum.getKey().equals(key)){
				return ienum.getCode();
			}
		}
		return null;
	}
	
	/**
	 * 根据给定code获取key
	 * @param clzs  枚举类 (该枚举类必须实现ICommonEnum接口)
	 * @param code  枚举code
	 * @return String 枚举key
	 * */
	public static Integer getKeyByCode(Class<?> clzs,String code){
		ICommonEnum[] commonEnums=getICommonEnums(clzs);
		if(null==commonEnums) return null;
		for(ICommonEnum ienum:commonEnums){
			if(ienum.getCode().equals(code)){
				return ienum.getKey();
			}
		}
		return null;
	}
	
	/**
	 * 根据给定value获取key
	 * @param clzs  枚举类 (该枚举类必须实现ICommonEnum接口)
	 * @param value 枚举value
	 * @return String 枚举key
	 * */
	public static Integer getKeyByValue(Class<?> clzs,String value){
		ICommonEnum[] commonEnums=getICommonEnums(clzs);
		if(null==commonEnums) return null;
		for(ICommonEnum ienum:commonEnums){
			if(ienum.getValue().equals(value)){
				return ienum.getKey();
			}
		}
		return null;
	}
	
	/**
	 * <p>根据给定枚举类得到该枚举类所有的codes集合</p>
	 * @param clzs
	 * @return 
	 * */
	public static List<String> getCodesByClz(Class<?> clzs){
		return getCodesByClz(clzs, null);
	}
	
	/**
	 * <p>根据给定枚举类得到该枚举类所有的keys集合</p>
	 * @param clzs
	 * @param suffix 待拼接的后缀
	 * @return 
	 * */
	public static List<String> getCodesByClz(Class<?> clzs,String suffix){
		ICommonEnum[] enums=getICommonEnums(clzs);
		List<String> result=new ArrayList<String>();
		for(ICommonEnum em:enums){
			result.add(em.getCode()+suffix);
		}
		return result;
	}
	
	/**
	 * <p>根据给定枚举类得到该枚举类所有的keys集合</p>
	 * @param clzs
	 * @return 
	 * */
	public static List<Integer> getKeysByClz(Class<?> clzs){
		ICommonEnum[] enums=getICommonEnums(clzs);
		List<Integer> result=new ArrayList<Integer>();
		for(ICommonEnum em:enums){
			result.add(em.getKey());
		}
		return result;
	}
	
	//----------------------------->  private method <-----------------------------
	
	public static ICommonEnum[] getICommonEnums(Class<?> clzs){
		ICommonEnum[] commonEnums=null;
		try {
			commonEnums=(ICommonEnum[]) getEnumConstants(clzs);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return commonEnums;
	}
	
	private static Object[] getEnumConstants(Class<?> clzs){
		Object[] objs=null;
		if(clzs.isEnum()){
			objs=clzs.getEnumConstants();
		}
		return objs;
	}
}
